`timescale 1ns / 1ps

module elevator2#(parameter floor = 40)( 
    input                                               clk , rst_n, 
    input                                               key , [7:0]H,[3:0]num, [9:0]weight, //紧急按键，是一个脉冲信号,H目标楼层，num人数，weight体重
    output  reg     [7:0]                               N   , //当前楼层
    output                                              alert   //警报信号
); 

assign alert = (num>13 || weight>=1000) ? 1:0 ;

reg [0:0] key_flag; //锁住紧急按钮信号拉高，直到到达层数后拉低
always @(posedge clk or negedge rst_n) begin  //key_flag控制
    if(!rst_n)
        key_flag <= 0;
    else
        if(key)
            key_flag<=1;
        else begin
            if (H==N)
                key_flag <= 0;
            else
                key_flag <= key_flag;
        end
end

//楼层控制
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        N <= 0;
    else begin
        if (H != N) begin //如果当前层数不一样
            if(H>N)begin //如果目标楼层大于当前楼层,需要up
                if(H>=2&&H<=9)begin // 如果目标楼层在2-9楼
                    if(key_flag == 1)
                        N<=N+1;
                    else
                        N<=N;
                end
                else
                    N<=N+1; //如果不是2-9楼，就直接上升
            end
            else begin //如果目标楼层小于当前楼层
                if(H>=2&&H<=9)begin // 如果目标楼层在2-9楼
                    if(key_flag == 1)
                        N<=N-1;
                    else
                        N<=N;
                end
                else
                    N<=N-1; //如果不是2-9楼，就直接下降
            end
        end
    end
end

endmodule
